package com.gsbelarus.gedemin.salary.util;

import android.content.Context;

import com.gsbelarus.gedemin.lib.Utils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public abstract class DateFormatHelper {

    /**
     * выставляет первое число месяца для "левой" даты и последнее число месяца для "правой"
     * если secondDate == null, возвращается промежуток в месяц (по первой дате).
     * если firstDate больше secondDate, меняет их местами.
     */
    public static Calendar[] getFixedDates(Calendar firstDate, Calendar secondDate) {
        Calendar fDate = (Calendar) firstDate.clone();
        Calendar sDate;
        Utils.initCalendarFields(fDate, Calendar.MONTH, 1);

        if (secondDate == null) {
            sDate = (Calendar) fDate.clone();
            sDate.set(Calendar.DAY_OF_MONTH, sDate.getActualMaximum(Calendar.DAY_OF_MONTH));
            return new Calendar[]{fDate, sDate};
        }

        sDate = (Calendar) secondDate.clone();
        Utils.initCalendarFields(sDate, Calendar.MONTH, 1);

        /** если firstDate меньше secondDate */
        if (fDate.compareTo(sDate) < 0) {
            sDate.set(Calendar.DAY_OF_MONTH, sDate.getActualMaximum(Calendar.DAY_OF_MONTH));
            return new Calendar[]{fDate, sDate};
        }

        /** если firstDate больше secondDate */
        if (fDate.compareTo(sDate) > 0) {
            sDate.set(Calendar.DAY_OF_MONTH, 1);
            fDate.set(Calendar.DAY_OF_MONTH, fDate.getActualMaximum(Calendar.DAY_OF_MONTH));
            return new Calendar[]{sDate, fDate};
        }

        /** если firstDate == secondDate */
        if (fDate.compareTo(sDate) == 0) {
            sDate = (Calendar) fDate.clone();
            sDate.set(Calendar.DAY_OF_MONTH, sDate.getActualMaximum(Calendar.DAY_OF_MONTH));
            return new Calendar[]{fDate, sDate};
        }

        return null;
    }

    /**
     * @return возвращает дату в формате yyyy-MM-dd
     */
    public static String getDateString(Calendar date) {
        return new SimpleDateFormat("yyyy-MM-dd").format(date.getTimeInMillis());
    }

    /**
     * @return возвращает локализованную дату в формате МЕСЯЦ ГОД
     */
    public static String getMonthString(Context context, Calendar date) {
        return Utils.getMonthName(context, date.get(Calendar.MONTH)) + " " + date.get(Calendar.YEAR);
    }

    /**
     * Adds the given amount to a {@code Calendar} field.
     *
     * @param field the {@code Calendar} field to modify.
     * @param value the amount to add to the field.
     */
    public static Date getDate(int field, int value) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(field, value);

        return new Date(calendar.getTimeInMillis());
    }

    public static Date[] getMonthPeriodDates(Calendar date) {
        Calendar firstDate = (Calendar) date.clone();
        firstDate.set(Calendar.DAY_OF_MONTH, 1);
        Utils.initCalendarFields(firstDate, Calendar.DAY_OF_MONTH, 0);

        Calendar lastDate = (Calendar) firstDate.clone();
        lastDate.set(Calendar.DAY_OF_MONTH, date.getActualMaximum(Calendar.DAY_OF_MONTH));
        lastDate.set(Calendar.HOUR_OF_DAY, 23);
        Utils.initCalendarFields(lastDate, Calendar.HOUR_OF_DAY, 59);

        return new Date[]{new Date(firstDate.getTimeInMillis()), new Date(lastDate.getTimeInMillis())};
    }
}
